﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область СлужебныйПрограммныйИнтерфейс

////////////////////////////////////////////////////////////////////////////////
// Обработчики событий подсистем конфигурации.

// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы.
Процедура ПослеНачалаРаботыСистемы() Экспорт
	
	ПараметрыРаботыКлиентаПриЗапуске = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске();
	Если ПараметрыРаботыКлиентаПриЗапуске.ОтображатьПомощникНастройкиРазрешений Тогда
		
		Если ПараметрыРаботыКлиентаПриЗапуске.ПроверитьПримененияРазрешенийНаИспользованиеВнешнихРесурсов Тогда
			
			ПослеПроверкиПримененияРазрешенийНаИспользованиеВнешнихРесурсов(
				ПараметрыРаботыКлиентаПриЗапуске.ПроверкаПримененияРазрешенийНаИспользованиеВнешнихРесурсов);
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

////////////////////////////////////////////////////////////////////////////////
// Логика перехода между операциями мастера настройки разрешений на использование
// внешних ресурсов.
//

// Выполняет запуск мастера настройки разрешений на использование служебных ресурсов.
//
// Результатом операции является открытие формы
// Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.ИнициализацияЗапросаРазрешений, для которой в
// качестве описания оповещения о закрытии установлена процедура
// ПослеИнициализацииЗапросаРазрешенийНаИспользованиеВнешнихРесурсов.
//
// Параметры:
//  Идентификаторы - Массив из УникальныйИдентификатор - идентификаторы запросов на использование внешних ресурсов,
//                  для применения которых вызывается мастер.
//  ФормаВладелец - ФормаКлиентскогоПриложения
//                - Неопределено - форма, по отношению которой открывался мастер.
//  ОповещениеОЗакрытии - ОписаниеОповещения, Неопределено - описание оповещения, обработка которого должна быть
//                        выполнена после завершения работы мастера.
//  РежимВключения - Булево - флаг того, что мастер вызывается при выполнении включения использования для информационной
//                            базы профилей безопасности.
//  РежимОтключения - Булево - флаг того, что мастер вызывается при выполнении отключения использования для
//                             информационной базы профилей безопасности.
//  РежимВосстановления - Булево - флаг того, что мастер вызывается для восстановления настроек профилей безопасности в
//                                 кластере серверов (по текущим данным информационной базы).
//
Процедура НачатьИнициализациюЗапросаРазрешенийНаИспользованиеВнешнихРесурсов(
		Знач Идентификаторы,
		Знач ФормаВладелец,
		Знач ОповещениеОЗакрытии,
		Знач РежимВключения = Ложь,
		Знач РежимОтключения = Ложь,
		Знач РежимВосстановления = Ложь) Экспорт
	
	Если РежимВключения ИЛИ РаботаВБезопасномРежимеКлиент.ОтображатьПомощникНастройкиРазрешений() Тогда
		
		Состояние = СостояниеЗапросаРазрешенийНаИспользованиеВнешнихРесурсов();
		Состояние.ИдентификаторыЗапросов = Идентификаторы;
		Состояние.ОписаниеОповещения = ОповещениеОЗакрытии;
		Состояние.ФормаВладелец = ФормаВладелец;
		Состояние.РежимВключения = РежимВключения;
		Состояние.РежимОтключения = РежимОтключения;
		Состояние.РежимВосстановления = РежимВосстановления;
		
		ПараметрыФормы = Новый Структура();
		ПараметрыФормы.Вставить("Идентификаторы", Идентификаторы);
		ПараметрыФормы.Вставить("РежимВключения", Состояние.РежимВключения);
		ПараметрыФормы.Вставить("РежимОтключения", Состояние.РежимОтключения);
		ПараметрыФормы.Вставить("РежимВосстановления", Состояние.РежимВосстановления);
		
		ОписаниеОповещения = Новый ОписаниеОповещения(
			"ПослеИнициализацииЗапросаРазрешенийНаИспользованиеВнешнихРесурсов",
			НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент,
			Состояние);
		
		ОткрытьФорму(
			"Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.ИнициализацияЗапросаРазрешений",
			ПараметрыФормы,
			ФормаВладелец,
			,
			,
			,
			ОписаниеОповещения,
			РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
		
	Иначе
		
		ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК);
		
	КонецЕсли;
	
КонецПроцедуры

// Выполняет переход к диалогу настройки разрешений в профилях безопасности.
// Результатом операции является открытии формы:
// Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов, 
// для которой в качестве описания оповещения о закрытии установлена процедура
// ПослеНастройкиРазрешенийНаИспользованиеВнешнихРесурсов или аварийное прерывание работы мастера.
//
// Параметры:
//  Результат - КодВозвратаДиалога - результат выполнения предыдущей операции мастера применения разрешений на
//                                   использование внешних ресурсов (используемые значения - ОК и Отмена),
//  Состояние - см. СостояниеЗапросаРазрешенийНаИспользованиеВнешнихРесурсов
//
//
Процедура ПослеИнициализацииЗапросаРазрешенийНаИспользованиеВнешнихРесурсов(Результат, Состояние) Экспорт
	
	Если ТипЗнч(Результат) = Тип("Структура") И Результат.КодВозврата = КодВозвратаДиалога.ОК Тогда
		
		СостояниеИнициализации = ПолучитьИзВременногоХранилища(Результат.АдресХранилищаСостояния);
		
		Если СостояниеИнициализации.ТребуетсяПрименениеРазрешений Тогда
			
			Состояние.АдресХранилища = СостояниеИнициализации.АдресХранилища;
			
			ПараметрыФормы = Новый Структура();
			ПараметрыФормы.Вставить("АдресХранилища", Состояние.АдресХранилища);
			ПараметрыФормы.Вставить("РежимВосстановления", Состояние.РежимВосстановления);
			ПараметрыФормы.Вставить("РежимПроверки", Состояние.РежимПроверки);
			
			ОписаниеОповещения = Новый ОписаниеОповещения(
				"ПослеНастройкиРазрешенийНаИспользованиеВнешнихРесурсов",
				НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент,
				Состояние);
			
			ОткрытьФорму(
				"Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов",
				ПараметрыФормы,
				Состояние.ФормаВладелец,
				,
				,
				,
				ОписаниеОповещения,
				РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
			
		Иначе
			
			// Запрошенные разрешения избыточны, внесение изменений в настройки профилей безопасности в кластере серверов
			// не требуется.
			ЗавершитьНастройкуРазрешенийНаИспользованиеВнешнихРесурсовАсинхронно(Состояние.ОписаниеОповещения);
			
		КонецЕсли;
		
	Иначе
		
		НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера.ОтменаПримененияЗапросовНаИспользованиеВнешнихРесурсов(
			Состояние.ИдентификаторыЗапросов);
		ПрерватьНастройкуРазрешенийНаИспользованиеВнешнихРесурсовАсинхронно(Состояние.ОписаниеОповещения);
		
	КонецЕсли;
	
КонецПроцедуры

// Выполняет переход к диалогу ожидания применения настроек профилей безопасности кластером серверов.
// Результатом операции является открытии формы:
// Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.ЗавершениеЗапросаРазрешений, для которой
// в качестве описания оповещения о закрытии установлена процедура
// ПослеЗавершенияЗапросаРазрешенийНаИспользованиеВнешнихРесурсов или аварийное прерывание работы мастера.
//
// Параметры:
//  Результат - КодВозвратаДиалога - результат выполнения предыдущей операции мастера применения разрешений на
//                                   использование внешних ресурсов (используемые значения - ОК, Пропустить и Отмена).
//                                   Значение Пропустить используется в том случае, если внесение изменений в настройки
//                                   профилей безопасности не вносилось, но запросы на использование внешних ресурсов
//                                   должны считаться успешно примененными (например, в том случае, если использование
//                                   всех запрашиваемых внешних ресурсов ранее уже предоставлялось),
//  Состояние - см. СостояниеЗапросаРазрешенийНаИспользованиеВнешнихРесурсов
//
Процедура ПослеНастройкиРазрешенийНаИспользованиеВнешнихРесурсов(Результат, Состояние) Экспорт
	
	Если Результат = КодВозвратаДиалога.ОК ИЛИ Результат = КодВозвратаДиалога.Пропустить Тогда
		
		ЗапланироватьПроверкуПримененияРазрешенийПослеЗакрытияФормыВладельца(
			Состояние.ФормаВладелец,
			Состояние.ИдентификаторыЗапросов);
		
		ПараметрыФормы = Новый Структура();
		ПараметрыФормы.Вставить("АдресХранилища", Состояние.АдресХранилища);
		ПараметрыФормы.Вставить("РежимВосстановления", Состояние.РежимВосстановления);
		
		Если Результат = КодВозвратаДиалога.ОК Тогда
			ПараметрыФормы.Вставить("Длительность", ДлительностьОжиданияПримененияИзменений());
		Иначе
			ПараметрыФормы.Вставить("Длительность", 0);
		КонецЕсли;
		
		ОписаниеОповещения = Новый ОписаниеОповещения(
			"ПослеЗавершенияЗапросаРазрешенийНаИспользованиеВнешнихРесурсов",
			НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент,
			Состояние);
		
		ОткрытьФорму(
			"Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.ЗавершениеЗапросаРазрешений",
			ПараметрыФормы,
			ЭтотОбъект,
			,
			,
			,
			ОписаниеОповещения,
			РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
		
	Иначе
		
		НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера.ОтменаПримененияЗапросовНаИспользованиеВнешнихРесурсов(
			Состояние.ИдентификаторыЗапросов);
		ПрерватьНастройкуРазрешенийНаИспользованиеВнешнихРесурсовАсинхронно(Состояние.ОписаниеОповещения);
		
	КонецЕсли;
	
КонецПроцедуры

// Выполняет завершение работы мастера применения разрешений на использование внешних ресурсов.
// Результатом операции является обработка описания оповещения, которое изначально было передано из формы, для которой
// открывался мастер.
//
// Параметры:
//  Результат - КодВозвратаДиалога - результат выполнения предыдущей операции мастера применения разрешений на
//                                   использование внешних ресурсов (используемые значения - ОК и Отмена),
//  Состояние - см. СостояниеЗапросаРазрешенийНаИспользованиеВнешнихРесурсов.
//
Процедура ПослеЗавершенияЗапросаРазрешенийНаИспользованиеВнешнихРесурсов(Результат, Состояние) Экспорт
	
	Если Результат = КодВозвратаДиалога.ОК Тогда
		
		ПоказатьОповещениеПользователя(НСтр("ru = 'Настройка разрешений'"),,
			НСтр("ru = 'Внесены изменения в настройки профилей безопасности в кластере серверов.'"));
		
		ЗавершитьНастройкуРазрешенийНаИспользованиеВнешнихРесурсовАсинхронно(Состояние.ОписаниеОповещения);
		
	Иначе
		
		НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера.ОтменаПримененияЗапросовНаИспользованиеВнешнихРесурсов(
			Состояние.ИдентификаторыЗапросов);
		ПрерватьНастройкуРазрешенийНаИспользованиеВнешнихРесурсовАсинхронно(Состояние.ОписаниеОповещения);
		
	КонецЕсли;
	
КонецПроцедуры

// Асинхронно (по отношению к коду, из которого вызывался мастер) выполняет обработку описания оповещения,
// которое изначально было передано из формы, для которой открывался мастер, возвращая код возврата ОК.
//
// Параметры:
//  ОписаниеОповещения - ОписаниеОповещения - которое было передано из вызывающего кода.
//
Процедура ЗавершитьНастройкуРазрешенийНаИспользованиеВнешнихРесурсовАсинхронно(Знач ОписаниеОповещения)
	
	ИмяПараметра = "СтандартныеПодсистемы.ОповещениеПриПримененииЗапросовНаИспользованиеВнешнихРесурсов";
	Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
		ПараметрыПриложения.Вставить(ИмяПараметра, Неопределено);
	КонецЕсли;
	ПараметрыПриложения[ИмяПараметра] = ОписаниеОповещения;
	
	ПодключитьОбработчикОжидания("ЗавершитьНастройкуРазрешенийНаИспользованиеВнешнихРесурсов", 0.1, Истина);
	
КонецПроцедуры

// Асинхронно (по отношению к коду, из которого вызывался мастер) выполняет обработку описания оповещения,
// которое изначально было передано из формы, для которой открывался мастер, возвращая код возврата Отмена.
//
// Параметры:
//  ОписаниеОповещения - ОписаниеОповещения - которое было передано из вызывающего кода.
//
Процедура ПрерватьНастройкуРазрешенийНаИспользованиеВнешнихРесурсовАсинхронно(Знач ОписаниеОповещения)
	
	ИмяПараметра = "СтандартныеПодсистемы.ОповещениеПриПримененииЗапросовНаИспользованиеВнешнихРесурсов";
	Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
		ПараметрыПриложения.Вставить(ИмяПараметра, Неопределено);
	КонецЕсли;
	ПараметрыПриложения[ИмяПараметра] = ОписаниеОповещения;
	
	ПодключитьОбработчикОжидания("ПрерватьНастройкуРазрешенийНаИспользованиеВнешнихРесурсов", 0.1, Истина);
	
КонецПроцедуры

// Синхронно (по отношению к коду, из которого вызывался мастер) выполняет обработку описания оповещения,
// которое изначально было передано из формы, для которой открывался мастер.
//
// Параметры:
//  КодВозврата - КодВозвратаДиалога.
//
Процедура ЗавершитьНастройкуРазрешенийНаИспользованиеВнешнихРесурсовСинхронно(Знач КодВозврата) Экспорт
	
	ОповещениеОЗакрытии = ПараметрыПриложения["СтандартныеПодсистемы.ОповещениеПриПримененииЗапросовНаИспользованиеВнешнихРесурсов"];
	ПараметрыПриложения["СтандартныеПодсистемы.ОповещениеПриПримененииЗапросовНаИспользованиеВнешнихРесурсов"] = Неопределено;
	Если ОповещениеОЗакрытии <> Неопределено Тогда
		ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозврата);
	КонецЕсли;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Логика вызова мастера настройки разрешений на использование внешних ресурсов для
// проверки завершения операций, в рамках которых ранее применялись запросы разрешений
// на использование внешних ресурсов.
//

// Запускает мастер в режиме проверки завершения операции, в рамках которой ранее применялись запросы
// разрешений на использование внешних ресурсов.
//
// Результатом выполнения данной процедуры является запуск мастера настройки разрешений на использование
// внешних ресурсов в режиме проверки завершения операции, в рамках которой ранее применялись разрешения
// на использование внешних ресурсов (с штатным прохождением всех операций), после завершения работы которого
// будет вызвана обработка описания оповещения, в качестве которого установлена процедура.
// ПослеПроверкиПримененияРазрешенийПослеЗакрытияФормыВладельца.
//
// Параметры:
//  Результат - Произвольный - результат закрытия формы, для которой открывался мастер настройки разрешений 
//                             на использование внешних ресурсов. В теле процедуры не используется, параметр требуется
//                             для назначения процедуры в качестве описания оповещения о закрытия формы.
//  Состояние - см. СостояниеПроверкиПримененияРазрешенийПослеЗакрытияФормыВладельца.
//
Процедура ПроверкаПримененияРазрешенийПослеЗакрытияФормыВладельца(Результат, Состояние) Экспорт
	
	ОригинальноеОписаниеОповещенияОЗакрытии = Состояние.ОписаниеОповещения;
	Если ОригинальноеОписаниеОповещенияОЗакрытии <> Неопределено Тогда
		ВыполнитьОбработкуОповещения(ОригинальноеОписаниеОповещенияОЗакрытии, Результат);
	КонецЕсли;
	
	Проверка = НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера.ПроверитьПрименениеРазрешенийНаИспользованиеВнешнихРесурсов();
	ПослеПроверкиПримененияРазрешенийНаИспользованиеВнешнихРесурсов(Проверка);
	
КонецПроцедуры

// Обрабатывает проверку применения запросов на использование внешних ресурсов.
//
// Параметры:
//  Проверка - см. НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера.ПроверитьПрименениеРазрешенийНаИспользованиеВнешнихРесурсов.
//
Процедура ПослеПроверкиПримененияРазрешенийНаИспользованиеВнешнихРесурсов(Знач Проверка)
	
	Если Не Проверка.РезультатПроверки Тогда
		
		СостояниеПрименения = СостояниеЗапросаРазрешенийНаИспользованиеВнешнихРесурсов();
		
		СостояниеПрименения.ИдентификаторыЗапросов = Проверка.ИдентификаторыЗапросов;
		СостояниеПрименения.АдресХранилища = Проверка.АдресВременногоХранилищаСостояния;
		СостояниеПрименения.РежимПроверки = Истина;
		
		Результат = Новый Структура();
		Результат.Вставить("КодВозврата", КодВозвратаДиалога.ОК);
		Результат.Вставить("АдресХранилищаСостояния", Проверка.АдресВременногоХранилищаСостояния);
		
		ПослеИнициализацииЗапросаРазрешенийНаИспользованиеВнешнихРесурсов(
			Результат, СостояниеПрименения);
		
	КонецЕсли;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Вызов мастера настройки разрешений на использование внешних ресурсов в
// специальных режимах.
//

// Вызывает мастер настройки разрешений на использование внешних ресурсов в режиме
// включения использования профилей безопасности для информационной базы.
//
// Параметры:
//  ФормаВладелец - ФормаКлиентскогоПриложения - форма, которая должна блокироваться до окончания применения разрешений,
//  ОповещениеОЗакрытии - ОписаниеОповещения - будет вызвано при успешном предоставлении разрешений.
//
Процедура НачатьВключениеИспользованияПрофилейБезопасности(ФормаВладелец, ОповещениеОЗакрытии = Неопределено) Экспорт
	
	НачатьИнициализациюЗапросаРазрешенийНаИспользованиеВнешнихРесурсов(
		Новый Массив(), ФормаВладелец, ОповещениеОЗакрытии, Истина, Ложь, Ложь);
	
КонецПроцедуры

// Вызывает мастер настройки разрешений на использование внешних ресурсов в режиме
// отключения использования профилей безопасности для информационной базы.
//
// Параметры:
//  ФормаВладелец - ФормаКлиентскогоПриложения - форма, которая должна блокироваться до окончания применения разрешений,
//  ОповещениеОЗакрытии - ОписаниеОповещения - будет вызвано при успешном предоставлении разрешений.
//
Процедура НачатьОтключениеИспользованияПрофилейБезопасности(ФормаВладелец, ОповещениеОЗакрытии = Неопределено) Экспорт
	
	НачатьИнициализациюЗапросаРазрешенийНаИспользованиеВнешнихРесурсов(
		Новый Массив(), ФормаВладелец, ОповещениеОЗакрытии, Ложь, Истина, Ложь);
	
КонецПроцедуры

// Вызывает мастер настройки разрешений на использование внешних ресурсов в режиме
// восстановления настроек профилей безопасности в кластере серверов по текущему
// состоянию информационной базы.
//
// Параметры:
//  ФормаВладелец - ФормаКлиентскогоПриложения - форма, которая должна блокироваться до окончания применения разрешений,
//  ОповещениеОЗакрытии - ОписаниеОповещения - будет вызвано при успешном предоставлении разрешений.
//
Процедура НачатьВосстановлениеПрофилейБезопасности(ФормаВладелец, ОповещениеОЗакрытии = Неопределено) Экспорт
	
	НачатьИнициализациюЗапросаРазрешенийНаИспользованиеВнешнихРесурсов(
		Новый Массив(), ФормаВладелец, ОповещениеОЗакрытии, Ложь, Ложь, Истина);
	
КонецПроцедуры

// Конструктор структуры, которая используется для хранения состояния работы мастера
// настройки разрешений на использование внешних ресурсов.
//
// Возвращаемое значение: 
//   Структура - описание полей см. в теле функции.
//
Функция СостояниеЗапросаРазрешенийНаИспользованиеВнешнихРесурсов()
	
	Результат = Новый Структура();
	
	// Идентификаторы запросов на использование внешних ресурсов, которые должны быть предоставлены.
	Результат.Вставить("ИдентификаторыЗапросов", Новый Массив());
	
	// Оригинальное описание оповещения, которое должно быть вызвано после того, как запрос
	// разрешений будет применен.
	Результат.Вставить("ОписаниеОповещения", Неопределено);
	
	// Адрес во временном хранилище, по которому размещаются данные, передаваемые между формами.
	Результат.Вставить("АдресХранилища", "");
	
	// Форма, из которой первоначально было инициализировано применение запросов на использование
	// внешних ресурсов.
	Результат.Вставить("ФормаВладелец");
	
	// Режим включения - признак выполнения включения использования профилей безопасности.
	Результат.Вставить("РежимВключения", Ложь);
	
	// Режим отключения - признак выполнения отключения использования профилей безопасности.
	Результат.Вставить("РежимОтключения", Ложь);
	
	// Режим восстановления - признак выполнения восстановления разрешений в профилях
	// безопасности (запрос разрешений выполняется "с чистого листа", игнорируя сохраненную
	// информацию о ранее предоставленных разрешениях.
	Результат.Вставить("РежимВосстановления", Ложь);
	
	// Режим проверки - признак завершения операции, в рамках которой предоставлялись новые разрешения
	// в профилях безопасности (например, в процессе записи элемента справочника были предоставлены разрешения
	// в профилях безопасности, а дальнейшая запись элемента справочника не была завершена).
	Результат.Вставить("РежимПроверки", Ложь);
	
	Возврат Результат;
	
КонецФункции

// Конструктор структуры, которая используется для хранения состояния проверки завершения
// операции, в рамках которой применялись запросы разрешений на использование внешних ресурсов.
//
// Возвращаемое значение: 
//   Структура - описание полей см. в теле функции.
//
Функция СостояниеПроверкиПримененияРазрешенийПослеЗакрытияФормыВладельца()
	
	Результат = Новый Структура();
	
	// Адрес во временном хранилище, по которому размещаются данные, передаваемые между формами.
	Результат.Вставить("АдресХранилища", Неопределено);
	
	// Оригинальное описание оповещения формы-владельца, которое должно быть вызвано после
	// выполнения проверки применения разрешений.
	Результат.Вставить("ОписаниеОповещения", Неопределено);
	
	Возврат Результат;
	
КонецФункции

// Возвращает длительность ожидания применения изменений в настройках профилей безопасности
// в кластере серверов.
//
// Возвращаемое значение:
//   Число - длительность ожидания применения изменений (в секундах).
//
Функция ДлительностьОжиданияПримененияИзменений()
	
	Возврат 20; // Интервал, через который rphost запрашивает текущие настройки профилей безопасности из rmngr.
	
КонецФункции

// Планирует (с помощью подмены значения свойства формы ОписаниеОповещенияОЗакрытии) вызов мастера
// для проверки завершения операции после закрытия формы, из которой мастер вызывался.
//
// Результатом выполнения данной процедуры является вызов процедуры.
// ПроверкаПримененияРазрешенийПослеЗакрытияФормыВладельца после закрытия формы, для которой 
// открывался мастер настройки разрешений на использование внешних ресурсов.
//
// Параметры:
//  ФормаВладелец - ФормаКлиентскогоПриложения, Неопределено - форма, после закрытия которой требуется выполнить
//    проверку завершения операций, в рамках которых ранее применялись запросы разрешений на использование
//    внешних ресурсов.
//  ИдентификаторыЗапросов - Массив из УникальныйИдентификатор - идентификаторы запросов разрешений на
//    использование внешних ресурсов, которые были применены в рамках операции, завершение которой проверяется.
//
Процедура ЗапланироватьПроверкуПримененияРазрешенийПослеЗакрытияФормыВладельца(ВладелецФормы, ИдентификаторыЗапросов)
	
	Если ТипЗнч(ВладелецФормы) = Тип("ФормаКлиентскогоПриложения") Тогда
		
		ИсходноеОписаниеОповещения = ВладелецФормы.ОписаниеОповещенияОЗакрытии;
		Если ИсходноеОписаниеОповещения <> Неопределено Тогда
			
			Если ИсходноеОписаниеОповещения.Модуль = НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент
					И ИсходноеОписаниеОповещения.ИмяПроцедуры = "ПроверкаПримененияРазрешенийПослеЗакрытияФормыВладельца" Тогда
				Возврат;
			КонецЕсли;
			
		КонецЕсли;
		
		Состояние = СостояниеПроверкиПримененияРазрешенийПослеЗакрытияФормыВладельца();
		Состояние.ОписаниеОповещения = ИсходноеОписаниеОповещения;
		
		ОписаниеОповещенияПроверкиПримененияРазрешений = Новый ОписаниеОповещения(
			"ПроверкаПримененияРазрешенийПослеЗакрытияФормыВладельца",
			НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент,
			Состояние);
		
		ВладелецФормы.ОписаниеОповещенияОЗакрытии = ОписаниеОповещенияПроверкиПримененияРазрешений;
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти